import java.util.ArrayList;

public class No034 {
    /**
     * 输入一颗二叉树的根节点和一个整数，打印出二叉树中结点值的和为输入整数的所有路径。
     * 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
     * (注意: 在返回值的list中，数组长度大的数组靠前)
     */
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;
        }
    }

    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        if (root == null || target < root.val) return result;
        Find(root, target, new ArrayList<>(), 0, result);
        return result;
    }

    public void Find(TreeNode root, int target, ArrayList<Integer> temp, int cur,
                     ArrayList<ArrayList<Integer>> result) {
        if (root == null || cur + root.val > target) return;
        // 是叶子且值等于target
        if (root.left == null && root.right == null && root.val + cur == target) {
            temp.add(root.val);
            result.add(temp);
            return;
        }

        temp.add(root.val);
        if (root.left != null) {
            Find(root.left, target, new ArrayList<>(temp), cur + root.val, result);
        }
        if (root.right != null) {
            Find(root.right, target, new ArrayList<>(temp), cur + root.val, result);
        }
    }
}
